\section{Análise Sobre a Linguagem Restringida}

\label{sec:dificuldades}

Para superarmos algumas das dificuldades apontadas na seção
\ref{sec:dificuldades}, escolhemos por fazer uma limitação na linguagem: não
permitir a declaração aninhada de funções, ou seja, uma função declarada dentro
de outra função, como no exemplo \ref{lst:exemploFuncaoAninhada}.

\begin{lstlisting}[frame=single,
caption={Declaração aninhada de funções,
ilegal em nossa linguagem restringida},label=lst:exemploFuncaoAninhada,
numbers=left, breaklines=true, language=PHP, extendedchars=true, literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}] 
<?php 
function a() {
	function b() {
		echo 'ok';
	}
}
?>
\end{lstlisting}

No caso do exemplo \ref{lst:exemploFuncaoAninhada}, a função \verb#b()# só seria
declarada quando/se a função \verb#a()# for chamada. Assim, seria impossível a
análise semântica antes do tempo de execução.

Fazendo a restrição de não permitir esse tipo de construção, pudemos fazer
checagens semânticas mais elaboradas, com tratamentos de escopos de variáveis,
acessos a funções ainda não definidas e funções com nome repetido. Para realizar
a restrição, definimos que uma declaração de função dentro de outra geraria erro
semântico, também detectado em nosso compilador.

\input{tex/testesRestringido}